package jianzhiOffer;

/**
 * 12. 矩阵中的路径
 * 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中，返回 true ；否则，返回 false 。
 * <p>
 * 单词必须按照字母顺序，通过相邻的单元格内的字母构成，其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
 *
 * @author 司松坡
 * @createTime 2023年05月04日
 */
public class Jian12 {
    public boolean exist(char[][] board, String word) {
        int a = board.length;
        int b = board[0].length;
        if (word.length() > a*b){
            return false;
        }
        boolean[][] booleans = new boolean[a][b];
        for (int i = 0; i < a; i++) {
            for (int j = 0; j < b; j++) {
                if (back(board,word,i,j,0,booleans)){
                    return true;
                }
            }
        }
        return false;
    }

    public boolean back(char[][] board, String word,int i,int j,int site,boolean[][] booleans){
        if (board[i][j] != word.charAt(site)){
            return false;
        } else {
            if ( site == word.length() - 1){
                return true;
            }
        }
        booleans[i][j] = true;
        int[][] directions = {{1,0},{0,1},{0,-1},{-1,0}};
        boolean result = false;
        for (int[] dir : directions) {
            int newi = i + dir[0], newj = j + dir[1];
            if (newi >= 0 && newi < board.length && newj >= 0 && newj < board[0].length) {
                if (!booleans[newi][newj]) {
                    boolean flag = back(board, word, newi, newj, site + 1,booleans);
                    if (flag) {
                        result = true;
                        break;
                    }
                }
            }
        }
        booleans[i][j] = false;
        return result;
    }

}
